/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package net.ieslaferreria.infoCiutat;

/**
 *
 * @author Administrador
 */
import org.garret.perst.IInputStream;
import org.garret.perst.IOutputStream;
import org.garret.perst.IPersistent;
import org.garret.perst.Index;
import org.garret.perst.Key;
import org.garret.perst.Persistent;
import org.garret.perst.Storage;
import org.garret.perst.Types;

/**
 *
 * @author Administrador
 */
public class Root extends Persistent{
    Index idPunt;
    Index nomPunt;
    
    Index idAresta;
    Index nomCarrer;
    
    Index idXarxa;
    Index nomXarxa;
    Index velocitat;
    
    //index de comptadors
    Index cont;
    
    Index dadesPersonals;
    
    // Deserialize the object
    public void readObject(IInputStream in) { 
        idPunt = (Index)in.readObject();
        nomPunt = (Index) in.readObject();        
        idAresta = (Index)in.readObject();
        nomCarrer = (Index) in.readObject();
        idXarxa = (Index) in.readObject();
        nomXarxa = (Index) in.readObject();
        velocitat = (Index) in.readObject();
        cont = (Index) in.readObject();
        dadesPersonals = (Index) in.readObject();
    }

    // Serialize the object
    public void writeObject(IOutputStream out) { 
        out.writeObject(idPunt);
        out.writeObject(nomPunt);
        out.writeObject(idAresta);
        out.writeObject(nomCarrer);
        out.writeObject(idXarxa);
        out.writeObject(nomXarxa);
        out.writeObject(velocitat);
        out.writeObject(cont);
        out.writeObject(dadesPersonals);
    }
    /*
     * Guarda una dada de manera persistent
     *
     */  
    public void afegirDadesPerst(Object o){
       String s;
       s = o.getClass().getName();
    
       if(s.equals("Punt")){               
           Punt p = (Punt)o;
           idPunt.put(new Key(p.getCodi()), p);
           nomPunt.put(new Key(p.getNom()), p);
       }else if(s.equals("Aresta")){
           Aresta a = (Aresta) o;
           idAresta.put(new Key(a.getCodi()), a);
           nomCarrer.put(new Key(a.getNom()), a);
       }else{
           Xarxa x = (Xarxa)o;
           idXarxa.put(new Key(x.getCodi()),(IPersistent) x);
           nomXarxa.put(new Key(x.getNom()),(IPersistent) x);
       }
       
    }
    /*
     * Tenim un Index de comptadors(cont) el cual conté diversos comptadors  
     *  de diversos tipus: Punt, Aresta, Xarxa
     * La funció comproba l'objecte que li passem de quin tipus és:
     *  Si existeix comptador, li suma 1 y retorna el valor.
     *  Sinó, crea un i retorna 0. El valor inicial del comptador.
     */
    public int nextId(Object o){
        String s;
        //que es? un Punt? una Aresta? una Xarxa?
        s = o.getClass().getName();
        Comptador c = (Comptador) cont.get(new Key(s));
        if( c == null ){
            Comptador nc = new Comptador(s);
            cont.put(new Key(s),nc );
        }
        c.valor++;
        return c.valor;
    }
    public Root(){}
    
    public Root(Storage db){
        super(db);
        idPunt = db.createIndex(Types.Int, true);
        nomPunt = db.createIndex(Types.String, false);
        idAresta = db.createIndex(Types.Int, true);
        nomCarrer = db.createIndex(Types.String, false);
        cont  = db.createIndex(Types.Int, true);
        dadesPersonals = db.createIndex(Types.String, true);
    }
    
}

